<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Imlib 和 gdk-pixbuf 之间的区别</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
<link rel="home" href="index.html" title="GDK-PixBuf参考手册">
<link rel="up" href="apa.html" title="Appendix A. 将 Imlib 程序移植到 gdk-pixbuf">
<link rel="prev" href="apa.html" title="Appendix A. 将 Imlib 程序移植到 gdk-pixbuf">
<link rel="next" href="apas03.html" title="将程序转换到 gdk-pixbuf">
<meta name="generator" content="GTK-Doc V1.17 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="apa.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="apa.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">GDK-PixBuf参考手册</th>
<td><a accesskey="n" href="apas03.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
</tr></table>
<div class="sect1">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="id3081385"></a><span class="application">Imlib</span> 和 <span class="application">gdk-pixbuf</span> 之间的区别</h2></div></div></div>
<p>
        总体来说，使用 <span class="application">Imlib</span> 的应用程序不必进行大量的改动就能使用
	<span class="application">gdk-pixbuf</span>；<span class="application">gdk-pixbuf</span> 的简单且柔性的 API 使事情变得很
	容易。这个章节描述了 <span class="application">Imlib</span> 和 <span class="application">gdk-pixbuf</span> 之间的不同之处。
	当你正转换你的程序到 <span class="application">gdk-pixbuf</span> 时，不妨考虑读读这个章节。
      </p>
<div class="sect2">
<div class="titlepage"><div><div><h3 class="title">
<a name="id3093369"></a>初始化</h3></div></div></div>
<p>
	  <span class="application">gdk-pixbuf</span> 库不需要初始化。
	</p>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
<h3 class="title">Note</h3>
<p>
	    在 GNOME 应用程序中，正常情况下都不需要初始化 <span class="application">Imlib</span>，
	    <code class="function">gnome_init()</code> 会自动调用 
	    <code class="function">gdk_imlib_init()</code>。
	  </p>
</div>
</div>
<div class="sect2">
<div class="titlepage"><div><div><h3 class="title">
<a name="id3093415"></a>内存管理</h3></div></div></div>
<p>
	  <span class="application">gdk-pixbuf</span> 库为图像处理提供了一个简单的，良好设计的内存管理机
	  制，该机制采用引用计数(reference counting)的方式。这将非常方便
	  的应用于需要在程序不同的部分共享图像的大型应用程序。作为一个鲜明的
	  对比，<span class="application">Imlib</span> 使用一种十分复杂图像和像素映射缓存(pixmap cache)
	  的机制，这使得程序的不同部分之间共享图像结构变得非常困难。不幸的
	  是，这种机制非常容易造成内存泄漏和难以捕捉的BUG。
	</p>
<p>
	  <span class="application">gdk-pixbuf</span> 中的基本原理是 当你得到一个新的 
	  <a class="link" href="gdk-pixbuf-gdk-pixbuf.html#GdkPixbuf">GdkPixbuf</a> 结构时，它在被创建
	  时就初始化为引用计数为 1。当程序的另一个部分想保持对该 pixbuf 的一
	  个引用时，应该调用 <code class="function">g_object_ref()</code> -- 这
	  将使引用计数增加 1。当程序的某个部分不需要再保持该 pixbuf 的引用并
	  想将其释放时，应该调用 <code class="function">g_object_unref()</code> -
	  - 这将使其引用计数减小 1。当其引用计数降到 0 的时候，这个 pixbuf 
	  被销毁或 <span class="emphasis"><em>finalized</em></span>，其内存被释放。
	</p>
<p>
	  有些程序需要缓存一个已经加载的图像，<span class="application">gdk-pixbuf</span> 提供了一中在对
	  pixbuf 的最后一次释放引用(unreference)操作设置一个钩子的方法来取
	  代析构(finalizing)这个 pixbuf，用户安装的钩子函数可以决定将该图像
	  缓存。
	</p>
<p>
	  最后，<span class="application">gdk-pixbuf</span> 不提供对于渲染过的 pixmap 的缓存。多数的程
	  序中都没有这个需要，因为缩放和渲染的函数都非常快，而且程序在每次调用
	  这些函数时可能需要参数值，例如，抖动和缩放的偏移值。
	</p>
<p>
	  在大多数程序中，当需要持有对一个 pixbuf 的一个额外的引用时，只需要简单
	  的调用 <code class="function">g_object_ref()</code>，当不再需要时调用 
	  <code class="function">g_object_unref()</code> 。
	</p>
</div>
<div class="sect2">
<div class="titlepage"><div><div><h3 class="title">
<a name="id3101259"></a>渲染过程</h3></div></div></div>
<p>
	  <span class="application">gdk-pixbuf</span> 库的策略是始终对你提供的 GDK drawable 进行渲染，它不会为你
	  创建。一般来说这个比 <span class="application">Imlib</span> 的始终创建一个 pixmap 并强制你使用的
	  策略更灵活。
	</p>
<p>
	  始终创建 pixmap 的缺点是当想将这个渲染的数据拷贝到另外一个 drawable
	  时，会浪费 X 服务器的内存，例如，最终的目标窗口或者一个临时绘制的 
	  pixmap。这是很常见的情况，不幸的是， <span class="application">Imlib</span> 策略引入了多余的复制。
	</p>
<p>
	  另外，<span class="application">Imlib</span> 只能渲染整个原始图像大小的 pixmap，不能对这个图像的
	  一个子区域进行渲染。这给一次只需要渲染一小部分的程序带来了不便，
	  例如进行滚动的程序。因为一次就需要渲染整个图像，这将导致性能和内存
	  使用的问题。
	</p>
<p>
	  <span class="application">gdk-pixbuf</span> 库允许渲染从一个图像的任何的矩形区域到你提供的任何
	  drawable。这使的程序具有很好的对图像渲染方式的控制。
	</p>
</div>
</div>
<div class="footer">
<hr>
          Generated by GTK-Doc V1.17</div>
</body>
</html>